package com.zidongxiangxi.lock.starter.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 分布式锁AOP拦截配置
 *
 * @author chenxudong
 * @version 1.0.0
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Locking {

    /**
     * 锁的ID或者说key，支持 SPEL (SPEL字符串的配置为 'service0001' ，这里的 SPEL 可以从参数中取值以及简单运算)
     *
     * @see <a href="https://docs.spring.io/spring-framework/docs/5.1.3.RELEASE/spring-framework-reference/core.html#expressions">Spring EL表达式文档</a>
     * @return 加锁条件表达式
     */
    String id();

    /**
     * 获取锁的等待时间，默认为0
     * 若waitTime<=0，则使用Lock.lock
     * 若waitTime>0，则使用Lock.tryLock
     *
     * @return 等待时间
     */
    long waitTime() default 0;

    /**
     * 条件，支持 SPEL，不为空且条件成功才会加锁(为 false 时直接执行业务代码)
     *
     * @return 加锁条件表达式
     */
    String condition() default "";

    /**
     * 加锁失败的时候的报错信息
     *
     * @return 报错信息
     */
    String failMsg() default "获取锁失败";
}
